package object;

/**
 * 成员方法传参机制(引用类型)
 */
public class MethodParameter02 {

    public static void main(String[] args) {

        /*
            1)C类中编写一个方法test100，可以接收一个数组，在方法中修改该数组，看看原来的数组是否变化？会变化
            2)C类中编写一个方法test200，可以接收一个P(age,sal)对象，在方法中修改该对象属性，看看原来的对象是否变化？会变化.
         */
        C c = new C();
        int[] arr = {1, 2, 3};
        c.test100(arr);// 调用方法
        System.out.println("main 的 arr 数组");
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();

        //测试
        P p = new P();
        p.name = "jack";
        p.age = 10;
        c.test200(p);// 调用方法

        //如果 test200执行的是 p = null, 下面的结果是10
        //如果 test200执行的是 p = new P(), 下面的结果是10
        System.out.println("main的p.age=" + p.age); //30

        //引用类型传递的是地址（传递的也是值，但值是地址），可以通过形参影响实参
    }


}

class P {

    String name;

    int age;
}

class C{

    public void test100(int[] arr) {
        arr[0] = 200;//修改元素
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
    }

    public void test200(P p) {
        p.name = "李四";
        p.age = 30;

        //此时是将test200栈内的p指向空，并不影响main栈的p的指向
        //p = null;

        //此时是将test200栈内的p指向新开辟的堆空间，只改变了test200栈内的p指向新的空间并改变属性值，并不影响main栈的p指向
//        p = new P();
//        p.name = "tom";
//        p.age = 99;
    }
}